﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using modele.impl;
using modele.interfaces;
using System.Windows;

namespace UI
{
    /**
     * \file TabManage.cs
     * \brief Classe gérant l'affichage du menu
     * \author Alexandre Carteron et Charles Robin
     * \version 1.0
     * \date 13/12/2012
     * 
     * Classe gérant l'affichage du menu
     */
    class TabManager
    {
        private static ComboBox comboprod; /*!<ComboBox qui permet le choix de production d'une ville*/
        /**
        * \fn public static void makeDocks()
        * \brief Crée le menu à partir des dernières coordonnées rencontrées 
        * 
        * Crée le menu à partir des dernières coordonnées rencontrées
        * 
        */
        public static void makeDocks()
        {
            makeDocks(lastX, lastY);
        }
        /**
        * \fn public static void reInit()
        * \brief Réinitialise la classe du chargement d'une carte 
        * 
        * Réinitialise la classe du chargement d'une carte
        * 
        */
        public static void reInit()
        {
            lastX = 0;
            lastY = 0;
            lastListe = new List<Unite>();
        }

        private static int lastX = 0;/*!<Abscisse de la dernière case cliquée*/

        private static int lastY = 0;/*!<Abscisse de la dernière case cliquée*/

        private static List<Unite> lastListe = new List<Unite>(); /*!<Dernière liste d'unitées affichées*/
        /**
        * \fn public static void makeDocks()
        * \brief Crée le menu à partir des coordonnées fournies 
        * 
        * Crée le menu à partir des coordonnées fournies
        * 
         * \param[in] x entier coordonnées horizontales
         * \param[in] y entier coordonnées verticales
        */
        public static void makeDocks(int x, int y)
        {
            lastX = x;
            lastY = y;
            List<Unite> j = JeuImpl.INSTANCE.joueurs[JeuImpl.INSTANCE.joueurCourant].unitesSelectionnees;
            if (j!=null)
            {
                Unite directeur = null; ;
                Unite enseignant;
                for (int i1 = 0, i2 = 0; i1 < j.Count; i1++)
                {
                    if (j[i2].GetType().FullName.Contains("Etudiant"))
                        i2++;
                    else if (j[i2].GetType().FullName.Contains("Enseignant"))
                    {
                        enseignant = j[i2];
                        j.Remove(enseignant);
                        j.Add(enseignant);
                    }
                    else if (j[i2].GetType().FullName.Contains("Directeur"))
                    {
                        directeur = j[i2];
                        j.Remove(directeur);
                    }
                }
                if (directeur != null)
                    j.Add(directeur);
            }
            Ville v = JeuImpl.INSTANCE.carte.getInfosCase(x, y).ville;
            MainWindow.INSTANCE.menuGauche.Items.Clear();
            if (v != null)
            {
                TabItem tab = new TabItem();
                Grid g = new Grid();
                tab.Header = "Ville";
                tab.Content = g;
                for (int i = 0; i < 6; i++)
                {
                    g.RowDefinitions.Add(new RowDefinition());
                    g.RowDefinitions[i].Height = GridLength.Auto;
                }
                g.ColumnDefinitions.Add(new ColumnDefinition());
                g.ColumnDefinitions[0].Width = new GridLength(100);
                g.ColumnDefinitions.Add(new ColumnDefinition());

                // Afficher autres propriétés
                g.Children.Add(newText("Ville", 0, 0));
                g.Children.Add(newText("RandomNom", 1, 0));
                g.Children.Add(newText("Aggrandissement : ", 0, 1));
                g.Children.Add(newText(v.stockNourriture + "/" + v.nbFoodForGrow(), 1, 1));
                g.Children.Add(newText("Production : ", 0, 2));
                g.Children.Add(newText(v.stockMinerais + "/" + v.coutProd, 1, 2));
                g.Children.Add(newText("Nourriture/tour: ", 0, 3));
                g.Children.Add(newText(""+v.nourriture , 1, 3));
                g.Children.Add(newText("Minerais/tour: ", 0, 4));
                g.Children.Add(newText(""+v.minerais, 1, 4));
                if (v.joueur == JeuImpl.INSTANCE.joueurs[JeuImpl.INSTANCE.joueurCourant])
                {
                    comboprod = newComboBoxprod(v, 0, 5);
                    g.Children.Add(comboprod);
                    g.Children.Add(newButtonprod(v, 1, 5));
                }
                MainWindow.INSTANCE.menuGauche.Items.Add(tab);
                MainWindow.INSTANCE.menuGauche.SelectedIndex = 0;
            }
            if (j == null)
                j = lastListe;
            else
                lastListe = j;
            if (!MainWindow.INSTANCE.gestionTour.brouillard[x,y])
            foreach (Unite u in j)
            {
                TabItem tab = new TabItem();
                if (u.GetType().FullName.Contains("Etudiant"))
                    tab.Header = "Etudiant";
                if (u.GetType().FullName.Contains("Enseignant"))
                    tab.Header = "Enseignant";
                if (u.GetType().FullName.Contains("Directeur"))
                    tab.Header = "Directeur";
                Grid g = new Grid();
                tab.Content = g;
                for (int i = 0; i < 6; i++)
                {
                    g.RowDefinitions.Add(new RowDefinition());
                    g.RowDefinitions[i].Height = GridLength.Auto;
                }
                g.ColumnDefinitions.Add(new ColumnDefinition());
                g.ColumnDefinitions[0].Width = new GridLength(100);
                g.ColumnDefinitions.Add(new ColumnDefinition());

                g.Children.Add(newText("Unité :", 0, 0));
                g.Children.Add(newText(getType(u), 1, 0));
                g.Children.Add(newText("Attaque : ", 0, 1));
                g.Children.Add(newText("" + u.attaque, 1, 1));
                g.Children.Add(newText("Defense : ", 0, 2));
                g.Children.Add(newText("" + u.defense, 1, 2));
                g.Children.Add(newText("Vie : ", 0, 3));
                g.Children.Add(newText(u.vie + "/" + u.getVieMax(), 1, 3));
                g.Children.Add(newText("Deplacement : ", 0, 4));
                g.Children.Add(newText("" + u.mouvement + "/" + u.getMouvementMax(), 1, 4));

                if (u is EnseignantImpl && u.joueur == JeuImpl.INSTANCE.joueurs[JeuImpl.INSTANCE.joueurCourant])
                {
                    g.Children.Add(creerVilleButton(u, 0, 5));
                }

                MainWindow.INSTANCE.menuGauche.Items.Add(tab);
                MainWindow.INSTANCE.menuGauche.SelectedIndex = 0;
            }
        }
        /**
        * \fn private static String getType(Unite u)
        * \brief Récupère le type d'une unité 
        * 
        * Récupère le type d'une unité
        * 
        * \param[in] u Unite dont on veut déterminer le type
        */
        private static String getType(Unite u)
        {
            if (u is Etudiant)
                return "Etudiant";
            else if (u is Enseignant)
                return "Enseignant";
            else
                return "Directeur";
        }

        /**
        * \fn private static TextBlock newText(string T, int x, int y)
        * \brief Met un texte sous forme d'un TextBloc aux coordonnées x,y
        * 
        * Met un texte sous forme d'un TextBloc aux coordonnées x,y
        * 
         * \param[in] x entier coordonnées horizontales
         * \param[in] y entier coordonnées verticales
        */
        private static TextBlock newText(string T, int x, int y)
        {
            TextBlock text = new TextBlock();
            text.Text = T;
            Grid.SetColumn(text, x);
            Grid.SetRow(text, y);
            return text;
        }


        /**
        * \fn private static ComboBox newComboBoxprod(Ville v, int x, int y)
        * \brief Affiche les informations d'une villes aux coordonnées x,y du menu
        * 
        * Affiche les informations d'une villes aux coordonnées x,y du menu
        * 
         * \param[in] x entier coordonnées horizontales
         * \param[in] y entier coordonnées verticales
        */
        private static ComboBox newComboBoxprod(Ville v, int x, int y)
        {
            ComboBox c = new ComboBox();
            c.Items.Add("Etudiant");
            c.Items.Add("Enseignant");
            c.Items.Add("DirecteurDpt");
            if (v.prodUnit.Equals("Enseignant"))
                c.SelectedItem = c.Items[1];
            else if (v.prodUnit == "Directeur")
                c.SelectedItem = c.Items[2];
            else
                c.SelectedItem = c.Items[0];
            Grid.SetColumn(c, x);
            Grid.SetRow(c, y);
            c.Name = "choixUnitProd";
            return c;
        }


        /**
        * \fn private static ComboBox newComboBoxprod(Ville v, int x, int y)
        * \brief Crée le bouton produire d'une ville aux coordonnées x,y
        * 
        * Crée le bouton produire d'une ville aux coordonnées x,y
        * 
         * \param[in] x entier coordonnées horizontales
         * \param[in] y entier coordonnées verticales
        */
        private static Button newButtonprod(Ville v,int x, int y)
        {
            Button but = new Button();
            but.Content = "Produire";
            Grid.SetColumn(but, x);
            Grid.SetRow(but, y);
            but.Click += new RoutedEventHandler(new RoutedEventHandler((object sender, RoutedEventArgs e) =>
            {
                if (comboprod.SelectedItem == comboprod.Items[0]){
                    v.produire("Etudiant");
                    TabManager.makeDocks();
                }
                else if (comboprod.SelectedItem == comboprod.Items[2])
                {
                    v.produire("Directeur");
                    TabManager.makeDocks();
                }
                else if (comboprod.SelectedItem == comboprod.Items[1])
                {
                    v.produire("Enseignant");
                    TabManager.makeDocks();
                }
            }));
            return but;
        }

        /**
        * \fn private static ComboBox newComboBoxprod(Ville v, int x, int y)
        * \brief Crée le bouton création d'une ville aux coordonnées x,y
        * 
        * Crée le bouton création d'une ville aux coordonnées x,y
        * 
         * \param[in] x entier coordonnées horizontales
         * \param[in] y entier coordonnées verticales
        */
        private static Button creerVilleButton(Unite u, int posPannelX, int posPannelY)
        {
            Button but = new Button();
            but.Content = "Fonder une ville";
            Grid.SetColumn(but, posPannelX);
            Grid.SetRow(but, posPannelY);
            but.Click += new RoutedEventHandler(new RoutedEventHandler((object sender, RoutedEventArgs e) =>
            {
                int x = u.x;
                int y = u.y;
                if (MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).dependanceVille == null && u.mouvement > 0) // consomme-t-on un point de mouvement pour créer la ville ?
                {
                    ((Enseignant)u).batirVille();
                    MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).ville = MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).ville;
                    MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).dependanceVille = MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).ville;
                    MainWindow.INSTANCE.gestionTour.creerVille(x, y);
                    MainWindow.INSTANCE.gestionTour.mettreAJourCarte();
                    MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).dependanceVille.joueur.villes.Add(MainWindow.INSTANCE.jeu.carte.getInfosCase(x, y).ville);
                    TabManager.makeDocks(x, y);
                    MainWindow.INSTANCE.gestionTour.mettreAJourCarte();
                    e.Handled = true;
                }
             }));
            return but;
        }
    }
}
